package com.yylany.service;

import com.yylany.bo.Specification;
import com.yylany.mapper.TbSpecificationMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * Description: pinyougou
 *
 * @author <a href="mailto:17777502615@163.com">yaoyonglong</a>
 * @date 2018/12/19
 * @since 1.0.0
 */
@Service
public class SpecificationService {

    private TbSpecificationMapper specificationMapper;

    @Autowired
    public SpecificationService(TbSpecificationMapper specificationMapper) {
        this.specificationMapper = specificationMapper;
    }

    /**
     * 通过CategoryId 查询所有的属性
     *
     * @param catid CategoryId
     * @return List<Specification>
     */
    public List<Map<String, Object>> specifications(int catid) {

        // 查询所有的属性，需要使用 map 进行对数据的过滤
        List<Specification> allByCategoryId = specificationMapper.findAllByCategoryId(catid);

        // 保存的是 data中所有的数据  key是spec_name value 是options
        Map<String, List<Map<String, Object>>> resultMap = new HashMap<>(8);

        allByCategoryId.forEach(specification -> {
            // 将每次遍历的数据 直接存在单独的map中，在下面判断的时候，直接使用这个map就好
            Map<String, Object> map = new HashMap<>(8);
            map.put("id", specification.getSelectedId());
            map.put("option_name", specification.getOption_name());
            map.put("spid", specification.getSpid());

            /**
             * 判断 resultMap 里面是否存在有这个属性名字，如果存在有，则将当前循环遍历的属性名 添加到 value 里面
             */
            if (resultMap.containsKey(specification.getSpec_name())) {
                List<Map<String, Object>> strings = resultMap.get(specification.getSpec_name());
                strings.add(map);
                resultMap.put(specification.getSpec_name(), strings);
            } else {
                ArrayList<Map<String, Object>> strings = new ArrayList<>();
                strings.add(map);
                resultMap.put(specification.getSpec_name(), strings);
            }
        });

        // 已经将所有的值，存放在 map中，
        // 只需要拼接对应的数据，返回既可


        /**
         * id:"规格ID",
         * spec_name:"规格名称",
         * selected:'当前被选中的值',
         * options:
         */

        List<Map<String, Object>> dataMap = new ArrayList<>();

        // 遍历上面的结果集
        Set<String> strings = resultMap.keySet();
        strings.forEach(specName -> {
            // 创建 options对象
            Map<String, Object> optionsMap = new HashMap<>(4);

            // 获取到所有的 options
            List<Map<String, Object>> maps = resultMap.get(specName);

            // 获取第一个 option 默认使用第一个作为默认选中的值
            Map<String, Object> stringObjectMap = maps.get(0);

            optionsMap.put("id", stringObjectMap.get("spid"));
            optionsMap.put("spec_name", specName);
            // 设置为0  只是说明是默认选中全部
            optionsMap.put("selected", 0);
            optionsMap.put("options", maps);
            dataMap.add(optionsMap);
        });
        return dataMap;
    }

}
